import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:自己定义实现顺序表的函数
 * User: 阿宾
 * Date: 2024-10-17
 * Time: 09:07
 */
public class MySeqList {
    private int[] elem;//用来存放数据元素
    private int useSize;//代表当前顺序表中的有效数据个数

    private static final int DEFAULT_SIZE = 2;//设置初始化顺序表容量

    //构造方法，用于初始化顺序表容量
    public MySeqList(){
        this.elem = new int[DEFAULT_SIZE];
    }

    /**
     * 打印数组中的所有元素
     */
    public void display(){
        for (int i = 0; i < this.useSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();

    }

    /**
     * 检查数组是否已满
     * @return
     */
    public boolean isFull(){
        if(this.useSize == this.elem.length){
            return true;
        }
        return false;
    }
    /**
     * 数组末尾添加一个新元素。如果数组已满，则进行扩容
     * @param data
     */
    public void add(int data){
        //1.先判断数组是否已满
        if(isFull()){
            //数组容量满，进行扩容
           this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //2.跳出if循环说明数组容量没满，可以进行插入数据操作
        this.elem[this.useSize] = data;
        this.useSize++;
    }



    /**
     * 在指定下标位置pos添加一个新元素。如果数组已满，则进行扩容
     * @param pos
     * @param data
     */
    public void add(int pos, int data){
        //1.先判断pos位置是否合法
        if(pos < 0 || pos > this.useSize){
            System.out.println("插入下标位置"+ pos +"不合法");
            return;
        }
        //2.判断数组容量是否已满
        if(isFull()){
            //数组容量满，进行扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //3.移动顺序表其他元素位置，方便数据插入
        for (int i = this.useSize; i > pos ; i--) {
            this.elem[i] = this.elem[i-1];
        }
        //4.插入数据，修改顺序表容量
        this.elem[pos] = data;
        this.useSize++;

    }

    /**
     * 检查数组中是否包含指定的元素
     * @param toFind
     * @return
     */
    public boolean contains(int toFind){
        for (int i = 0; i < this.useSize; i++) {
            if(this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

    /**
     * 返回指定元素在数组中首次出现的下标索引，如果不存在则返回-1
     * @param toFind
     * @return
     */
    public int indexOf(int toFind){
        //直接遍历顺序表查找对应元素
        for (int i = 0; i < this.useSize; i++) {
            if(toFind == this.elem[i]){
                return i;
            }
        }
        return -1;
    }

    /**
     * 返回指定位置pos的元素
     * @param pos
     * @return
     */
    public int get(int pos){
        //1.先判断位置是否合法，注意和上边添加元素时判断位置合法区别
        //返回位置不可以是在顺序表大小位置
        /*if(pos < 0 || pos >= this.useSize){
            System.out.println("位置"+pos+"不合法");
            return;
        }*/
        checkPos(pos);
        //2.返回指定位置元素
        return this.elem[pos];

    }

    /**
     * 设置指定位置pos的元素为value
     * @param pos
     * @param value
     */
    public void set(int pos, int value){
        //1.先检查位置是否合法
        /*if(pos < 0 || pos >= this.useSize){
            System.out.println("位置"+pos+"不合法");
            return;
        }*/
        checkPos(pos);
        //2.修改元素值
        this.elem[pos] = value;

    }
    //发现set函数和get函数中判断位置函数代码相同，可以封装起来
    //并且因为我们只想在这个类中使用，主要是为了代码简洁，所以使用
    //private修饰

    /**
     * 检查指定位置pos是否合法
     * @param pos
     */
    private void checkPos(int pos){
        if(pos < 0 || pos >= this.useSize){
            System.out.println("位置"+pos+"不合法");
            return;
        }
    }

    /**
     * 删除数组中第一次出现的指定元素
     * @param toRemove
     */
    public void remove(int toRemove){
        //1.可以先判断指定元素是否存在，使用上述函数index
        int index = indexOf(toRemove);
        if(index == -1){
            //说明元素不存在
            System.out.println(toRemove + "元素不存在");
            return;
        }
        //2.跳过if循环，说明元素存在，开始移动顺序表
        for (int i = index; i < this.useSize-1; i++) {
            this.elem[i] = this.elem[i+1];
        }
        //3.修改顺序表容量
        this.useSize--;


    }

    /**
     * 获取顺序表的长度
     * @return
     */
    public int size(){
        return this.useSize;
    }

    /**
     * 清空顺序表
     */
    public void clear(){
        this.useSize = 0;
    }
}
